/**
 * @ProjectName: go-learn-demo
 * @PackageName: ginybxb
 * @Description:
 * @Author: hy.bai
 * @Date: 2025-08-03 17:55
 */
package ginybxb

import (
	"github.com/gin-gonic/gin"
	"log/slog"
	"net/http"
)

// 处理/index请求
func HandlerIndex(context *gin.Context) {
	context.JSON(http.StatusOK, gin.H{
		"code": 2000,
		"data": nil,
		"msg":  "Index页面",
	})
}

// 处理/home请求
func HandlerHome(context *gin.Context) {
	context.JSON(http.StatusOK, gin.H{
		"code": 2000,
		"data": nil,
		"msg":  "Home页面",
	})
}

// 验证token的中间件
// 注意：gin.HandlerFunc是func(*Context)类型。所以:定义中间件时,返回值是"gin.HandlerFunc"和"func(*gin.Context)"是等价的。
// func AuthMiddleware() gin.HandlerFunc {
func AuthMiddleware() func(ctx *gin.Context) {
	return func(context *gin.Context) {
		request := context.Request
		// 客户端携带Token有三种方式:1.放在请求头 2.放在请求体 3.放在URI
		token := request.Header.Get("token") // 从请求头中，获取token:xxxxxx
		slog.Info("token:", token)
		// 验证token不为空或token值不正确
		if len(token) == 0 || token != "123456" {
			context.JSON(http.StatusOK, gin.H{
				"code": 4000,
				"data": nil,
				"msg":  "token验证失败~~~",
			})
			context.Abort() // 验证失败，中断请求
			// context.Abort()方法的作用：中断后续的请求处理。即：跳出HandlerFunc链表，后面的Handler都不会执行了。
			return // return的作用是不执行之后的代码。即：不执行后面的日志打印
		}
		// 注意:token验证失败时，因为存在return,所以才不会执行在验证成功的日志打印。
		slog.Info("token验证成功")
	}
}

// 测试token
func TestAuthMiddleware() {

	// 1.实例化gin对象
	r := gin.Default()

	// 2.注册服务
	// index首页无需token直接访问
	r.GET("/index", HandlerIndex)

	// home家目录需要对token进行验证，验证通过才可访问
	r.Use(AuthMiddleware())
	// 注册home服务
	r.GET("/home", HandlerHome)

	// 3.启动服务
	err := r.Run(":8080")
	if err != nil {
		slog.Info("启动服务失败: %v\n", err)
		return
	}
}
